package controller

import (
	"encoding/json"
	"fmt"
	"io/ioutil"
	"net/http"
	// "github.com/gin-gonic/gin"
)

var Vote = new(voteCtl)

type voteCtl struct{}

type Person struct {
	Id          string `json:"id"`
	Name        string `json:"name"`
	Age         string `json:"age"`
	Emai        string `json:"email"`
	Phone       string `json:"phone"`
	Belong      string `json:"belong"`
	Role        string `json:"role"`
	Description string `json:"description"`
}

var urlJson = "./public/json/Persons.json"

// 使用http包
func (c *voteCtl) GetPersons(w http.ResponseWriter, r *http.Request) {
	// 读取json文件
	data, err := ioutil.ReadFile("urlJson")
	if err != nil {
		fmt.Println("读取文件失败")
	}
	// 将json文件转换为map
	var personMap map[string]interface{}
	err = json.Unmarshal(data, &personMap)
	if err != nil {
		fmt.Println("转换失败")
	}
	// 返回json数据
	w.Header().Set("Content-Type", "application/json")
	w.WriteHeader(http.StatusOK)
	json.NewEncoder(w).Encode(personMap)

	// fmt.Println("personMap", personMap["data"])
	// 使用http包数据返回给前端

}

// func (c *voteCtl) GetPersons(ctx *gin.Context) {
// 	// 读取json文件
// 	// data, err := ioutil.ReadFile("C:/Users/王春雨/Desktop/project/gomvc/public/json/Persons.json")
// 	data, err := ioutil.ReadFile(urlJson)
// 	if err != nil {
// 		fmt.Println("读取文件失败")
// 	}
// 	// 将json文件转换为map
// 	var personMap map[string]interface{}
// 	err = json.Unmarshal(data, &personMap)
// 	if err != nil {
// 		fmt.Println("转换失败")
// 	}

// 	// fmt.Println("personMap", personMap["data"])
// 	ctx.JSON(200, gin.H{
// 		"code": 0,
// 		"msg":  "success",
// 		"data": personMap["data"],
// 	})
// }

// func (c *voteCtl) AddPerson1(ctx *gin.Context) {
// 	var person Person
// 	ctx.BindJSON(&person)
// 	// 读取json文件
// 	data, err := ioutil.ReadFile(urlJson)
// 	if err != nil {
// 		fmt.Println("读取文件失败")
// 	}
// 	// 将json文件转换为map
// 	var personMap map[string]interface{}
// 	err = json.Unmarshal(data, &personMap)
// 	if err != nil {
// 		fmt.Println("转换失败")
// 	}
// 	result := personMap["data"].([]interface{})
// 	result = append(result, person)
// 	personMap["data"] = result
// 	// 将map转换为json
// 	jsonData, err := json.Marshal(personMap)
// 	if err != nil {
// 		fmt.Println("转换失败")
// 	}
// 	// 将json写入文件
// 	err = ioutil.WriteFile(urlJson, jsonData, 0666)
// 	if err != nil {
// 		fmt.Println("写入失败")
// 	}
// 	ctx.JSON(200, gin.H{
// 		"code": 0,
// 		"msg":  "success",
// 	})
// }

func (c *voteCtl) AddPerson(w http.ResponseWriter, r *http.Request) {
	var person Person

	// 获取post请求的body
	body, err := ioutil.ReadAll(r.Body)
	if err != nil {
		fmt.Println("读取body失败")
	}
	// body转换为map
	var personMap1 map[string]interface{}
	err = json.Unmarshal(body, &personMap1)
	if err != nil {
		fmt.Println("转换失败")
	}
	// 将map转换为struct
	person.Id = personMap1["id"].(string)
	person.Name = personMap1["name"].(string)
	person.Age = personMap1["age"].(string)
	person.Emai = personMap1["email"].(string)
	person.Phone = personMap1["phone"].(string)
	person.Belong = personMap1["belong"].(string)
	person.Role = personMap1["role"].(string)
	person.Description = personMap1["description"].(string)

	// 读取json文件
	data, err := ioutil.ReadFile(urlJson)
	if err != nil {
		fmt.Println("读取文件失败")
	}
	// 将json文件转换为map
	var personMap map[string]interface{}
	err = json.Unmarshal(data, &personMap)
	if err != nil {
		fmt.Println("转换失败")
	}
	result := personMap["data"].([]interface{})
	result = append(result, person)
	personMap["data"] = result
	// 将map转换为json
	jsonData, err := json.Marshal(personMap)
	if err != nil {
		fmt.Println("转换失败")
	}
	// 将json写入文件
	err = ioutil.WriteFile(urlJson, jsonData, 0666)
	if err != nil {
		fmt.Println("写入失败")
	}
	// code:0,msg:"success"返回给前端
	// w.Header().Set("Content-Type", "application/json")
	// w.WriteHeader(http.StatusOK)
	// json.NewEncoder(w).Encode(personMap)
}

// func (c *voteCtl) DeletePerson(ctx *gin.Context) {
// 	var person Person
// 	ctx.BindJSON(&person)
// 	// 读取json文件
// 	data, err := ioutil.ReadFile(urlJson)
// 	if err != nil {
// 		fmt.Println("读取文件失败")
// 	}
// 	// 将json文件转换为map
// 	var personMap map[string]interface{}
// 	err = json.Unmarshal(data, &personMap)
// 	if err != nil {
// 		fmt.Println("转换失败")
// 	}
// 	result := personMap["data"].([]interface{})
// 	for i, v := range result {
// 		if v.(map[string]interface{})["id"] == person.Id {
// 			result = append(result[:i], result[i+1:]...)
// 			break
// 		}
// 	}
// 	personMap["data"] = result
// 	// 将map转换为json
// 	jsonData, err := json.Marshal(personMap)
// 	if err != nil {
// 		fmt.Println("转换失败")
// 	}
// 	// 将json写入文件
// 	err = ioutil.WriteFile(urlJson, jsonData, 0666)
// 	if err != nil {
// 		fmt.Println("写入失败")
// 	}
// 	ctx.JSON(200, gin.H{
// 		"code": 0,
// 		"msg":  "success",
// 	})
// }

func (c *voteCtl) DeletePerson(w http.ResponseWriter, r *http.Request) {
	var person Person
	// 获取post请求的body
	body, err := ioutil.ReadAll(r.Body)
	if err != nil {
		fmt.Println("读取body失败")
	}
	// body转换为map
	var personMap1 map[string]interface{}
	err = json.Unmarshal(body, &personMap1)
	if err != nil {
		fmt.Println("转换失败")
	}
	// 将map转换为struct
	person.Id = personMap1["id"].(string)
	// person.Name = personMap1["name"].(string)
	// person.Age = personMap1["age"].(string)
	// person.Emai = personMap1["email"].(string)
	// person.Phone = personMap1["phone"].(string)
	// person.Belong = personMap1["belong"].(string)
	// person.Role = personMap1["role"].(string)
	// person.Description = personMap1["description"].(string)

	// 读取json文件
	data, err := ioutil.ReadFile(urlJson)
	if err != nil {
		fmt.Println("读取文件失败")
	}
	// 将json文件转换为map
	var personMap map[string]interface{}
	err = json.Unmarshal(data, &personMap)
	if err != nil {
		fmt.Println("转换失败")
	}
	result := personMap["data"].([]interface{})
	for i, v := range result {
		if v.(map[string]interface{})["id"] == person.Id {
			result = append(result[:i], result[i+1:]...)
			break
		}
	}
	personMap["data"] = result
	// 将map转换为json
	jsonData, err := json.Marshal(personMap)
	if err != nil {
		fmt.Println("转换失败")
	}
	// 将json写入文件
	err = ioutil.WriteFile(urlJson, jsonData, 0666)
	if err != nil {
		fmt.Println("写入失败")
	}
	// code:0,msg:"success"返回给前端
	w.Header().Set("Content-Type", "application/json")
	w.WriteHeader(http.StatusOK)
	// json.NewEncoder(w).Encode(personMap)

}

// func (c *voteCtl) UpdatePerson(ctx *gin.Context) {
// 	var person Person
// 	ctx.BindJSON(&person)
// 	// 读取json文件
// 	data, err := ioutil.ReadFile(urlJson)
// 	if err != nil {
// 		fmt.Println("读取文件失败")
// 	}
// 	// 将json文件转换为map
// 	var personMap map[string]interface{}
// 	err = json.Unmarshal(data, &personMap)
// 	if err != nil {
// 		fmt.Println("转换失败")
// 	}
// 	result := personMap["data"].([]interface{})
// 	for i, v := range result {
// 		if v.(map[string]interface{})["id"] == person.Id {
// 			result[i] = person
// 			break
// 		}
// 	}
// 	personMap["data"] = result
// 	// 将map转换为json
// 	jsonData, err := json.Marshal(personMap)
// 	if err != nil {
// 		fmt.Println("转换失败")
// 	}
// 	// 将json写入文件
// 	err = ioutil.WriteFile(urlJson, jsonData, 0666)
// 	if err != nil {
// 		fmt.Println("写入失败")
// 	}
// 	ctx.JSON(200, gin.H{
// 		"code": 0,
// 		"msg":  "success",
// 	})
// }

func (c *voteCtl) UpdatePerson(w http.ResponseWriter, r *http.Request) {
	var person Person
	// 获取post请求的body
	body, err := ioutil.ReadAll(r.Body)
	if err != nil {
		fmt.Println("读取body失败")
	}
	// body转换为map
	var personMap1 map[string]interface{}
	err = json.Unmarshal(body, &personMap1)
	if err != nil {
		fmt.Println("转换失败")
	}
	// 将map转换为struct
	person.Id = personMap1["id"].(string)
	person.Name = personMap1["name"].(string)
	person.Age = personMap1["age"].(string)
	person.Emai = personMap1["email"].(string)
	person.Phone = personMap1["phone"].(string)
	person.Belong = personMap1["belong"].(string)
	person.Role = personMap1["role"].(string)
	person.Description = personMap1["description"].(string)

	// 读取json文件
	data, err := ioutil.ReadFile(urlJson)
	if err != nil {
		fmt.Println("读取文件失败")
	}
	// 将json文件转换为map
	var personMap map[string]interface{}
	err = json.Unmarshal(data, &personMap)
	if err != nil {
		fmt.Println("转换失败")
	}
	result := personMap["data"].([]interface{})
	for i, v := range result {
		if v.(map[string]interface{})["id"] == person.Id {
			result[i] = person
			break
		}
	}
	personMap["data"] = result
	// 将map转换为json
	jsonData, err := json.Marshal(personMap)
	if err != nil {
		fmt.Println("转换失败")
	}
	// 将json写入文件
	err = ioutil.WriteFile(urlJson, jsonData, 0666)
	if err != nil {
		fmt.Println("写入失败")
	}
	// code:0,msg:"success"返回给前端
	w.Header().Set("Content-Type", "application/json")
	w.WriteHeader(http.StatusOK)

}

type VoteReq struct {
	Id          string   `json:"id"`
	Name        string   `json:"name"`
	Leaders     any      `json:"leaders"`
	Depart      any      `json:"departments"`
	Electee     any      `json:"electee"`
	Date        any      `json:"date"`
	Masses      any      `json:"masses"`
	Notice      string   `json:"notice"`
	Ratio       any      `json:"ratio"`
	AllScore    any      `json:"allScore"`
	FormType    string   `json:"formType"`
	CompletedQr []string `json:"completedQr"`
	Desc        string   `json:"desc"`
}

// func (c *voteCtl) CreateVote(ctx *gin.Context) {
// 	var voteReq VoteReq
// 	ctx.BindJSON(&voteReq)
// 	// 读取json文件
// 	data, err := ioutil.ReadFile("./public/json/Vote.json")
// 	if err != nil {
// 		fmt.Println("读取文件失败")
// 	}
// 	// 将json文件转换为map
// 	var voteMap map[string]interface{}
// 	err = json.Unmarshal(data, &voteMap)
// 	if err != nil {
// 		fmt.Println("转换失败")
// 	}
// 	result := voteMap["data"].([]interface{})
// 	result = append(result, voteReq)
// 	voteMap["data"] = result
// 	// 将map转换为json
// 	jsonData, err := json.Marshal(voteMap)
// 	if err != nil {
// 		fmt.Println("转换失败")
// 	}
// 	// 将json写入文件
// 	err = ioutil.WriteFile("./public/json/Vote.json", jsonData, 0666)
// 	if err != nil {
// 		fmt.Println("写入失败")
// 	}
// 	ctx.JSON(200, gin.H{
// 		"code": 0,
// 		"msg":  "success",
// 	})
// }

// func (c *voteCtl) GetVote(ctx *gin.Context) {
// 	// 获取参数id
// 	id := ctx.Query("id")
// 	// 读取json文件
// 	data, err := ioutil.ReadFile("./public/json/Vote.json")
// 	if err != nil {
// 		fmt.Println("读取文件失败")
// 	}
// 	// 将json文件转换为map
// 	var voteMap map[string]interface{}
// 	err = json.Unmarshal(data, &voteMap)
// 	if err != nil {
// 		fmt.Println("转换失败")
// 	}
// 	result := voteMap["data"].([]interface{})
// 	for _, v := range result {
// 		if v.(map[string]interface{})["id"] == id {
// 			ctx.JSON(200, gin.H{
// 				"code": 0,
// 				"msg":  "success",
// 				"data": v,
// 			})
// 			return
// 		}
// 	}
// 	ctx.JSON(200, gin.H{
// 		"code": 1,
// 		"msg":  "fail",
// 	})
// }

type SubVote struct {
	Id       string `json:"id"`
	Qrcode   string `json:"qrcode"`
	AllScore []struct {
		Text  string   `json:"text"`
		Value string   `json:"value"`
		Score []string `json:"score"`
	} `json:"allScore"`
}

// func (c *voteCtl) SubVote(ctx *gin.Context) {
// 	var subVote SubVote
// 	ctx.BindJSON(&subVote)
// 	// fmt.Println(subVote.AllScore)
// 	// 读取json文件
// 	data, err := ioutil.ReadFile("./public/json/Vote.json")
// 	if err != nil {
// 		fmt.Println("读取文件失败")
// 	}
// 	// 将json文件转换为map
// 	var voteMap map[string]interface{}
// 	err = json.Unmarshal(data, &voteMap)
// 	if err != nil {
// 		fmt.Println("转换失败")
// 	}
// 	result := voteMap["data"].([]interface{})
// 	for i, v := range result {
// 		if v.(map[string]interface{})["id"] == subVote.Id {
// 			v.(map[string]interface{})["completedQr"] = append(v.(map[string]interface{})["completedQr"].([]interface{}), subVote.Qrcode)
// 			for j, v := range result[i].(map[string]interface{})["electee"].([]interface{}) {
// 				for _, v1 := range subVote.AllScore {
// 					if v1.Text == v.(map[string]interface{})["name"] {
// 						result[i].(map[string]interface{})["electee"].([]interface{})[j].(map[string]interface{})["score"] = append(v.(map[string]interface{})["score"].([]interface{}), v1.Score)
// 					}
// 				}
// 			}
// 			break
// 		}
// 	}
// 	voteMap["data"] = result
// 	// 将map转换为json
// 	jsonData, err := json.Marshal(voteMap)
// 	if err != nil {
// 		fmt.Println("转换失败")
// 	}
// 	// 将json写入文件
// 	err = ioutil.WriteFile("./public/json/Vote.json", jsonData, 0666)
// 	if err != nil {
// 		fmt.Println("写入失败")
// 	}
// 	ctx.JSON(200, gin.H{
// 		"code": 0,
// 		"msg":  "success",
// 	})
// }

// func (c *voteCtl) GetVoteResult(ctx *gin.Context) {
// 	// 获取全部的数据
// 	data, err := ioutil.ReadFile("./public/json/Vote.json")
// 	if err != nil {
// 		fmt.Println("读取文件失败")
// 	}
// 	// 将json文件转换为map
// 	var voteMap map[string]interface{}
// 	err = json.Unmarshal(data, &voteMap)
// 	if err != nil {
// 		fmt.Println("转换失败")
// 	}
// 	result := voteMap["data"].([]interface{})
// 	ctx.JSON(200, gin.H{
// 		"code": 0,
// 		"msg":  "success",
// 		"data": result,
// 	})
// }

type VoteResult struct {
	Id string `json:"id"`
}

// func (c *voteCtl) DeleteVoteResult(ctx *gin.Context) {
// 	// 获取参数id
// 	// id := ctx.Query("id")
// 	var voteReq VoteResult
// 	ctx.BindJSON(&voteReq)
// 	id := voteReq.Id
// 	fmt.Println("id: ", id)
// 	// 读取json文件
// 	data, err := ioutil.ReadFile("./public/json/Vote.json")
// 	if err != nil {
// 		fmt.Println("读取文件失败")
// 	}
// 	// 将json文件转换为map
// 	var voteMap map[string]interface{}
// 	err = json.Unmarshal(data, &voteMap)
// 	if err != nil {
// 		fmt.Println("转换失败")
// 	}
// 	result := voteMap["data"].([]interface{})
// 	for i, v := range result {
// 		if v.(map[string]interface{})["id"] == id {
// 			result = append(result[:i], result[i+1:]...)
// 			break
// 		}
// 	}
// 	voteMap["data"] = result
// 	// 将map转换为json
// 	jsonData, err := json.Marshal(voteMap)
// 	if err != nil {
// 		fmt.Println("转换失败")
// 	}
// 	// 将json写入文件
// 	err = ioutil.WriteFile("./public/json/Vote.json", jsonData, 0666)
// 	if err != nil {
// 		fmt.Println("写入失败")
// 	}
// 	ctx.JSON(200, gin.H{
// 		"code": 0,
// 		"msg":  "success",
// 	})
// }

// func (c *voteCtl) UploadQr(ctx *gin.Context) {
// 	// 清空文件夹
// 	err := os.RemoveAll("./public/tempImage")
// 	if err != nil {
// 		fmt.Println("清空文件夹失败")
// 	}
// 	// 创建文件夹
// 	err = os.Mkdir("./public/tempImage", 0777)
// 	if err != nil {
// 		fmt.Println("创建文件夹失败")
// 	}
// 	// 获取文件,遍历FormFile
// 	form, _ := ctx.MultipartForm()
// 	files := form.File["file"]
// 	for _, file := range files {
// 		// 生成随机文件名
// 		rand.Seed(time.Now().UnixNano())
// 		randNum := rand.Intn(100000)
// 		fileName := strconv.Itoa(randNum) + file.Filename
// 		// 保存文件
// 		err = ctx.SaveUploadedFile(file, "./public/tempImage/"+fileName)
// 		if err != nil {
// 			fmt.Println("保存文件失败")
// 		}
// 	}
// 	// file, err := ctx.FormFile("file")
// 	// if err != nil {
// 	// 	fmt.Println("获取文件失败")
// 	// }
// 	// // 生成随机文件名
// 	// rand.Seed(time.Now().UnixNano())
// 	// randNum := rand.Intn(100000)
// 	// fileName := strconv.Itoa(randNum) + file.Filename
// 	// // 保存文件
// 	// err = ctx.SaveUploadedFile(file, "./public/tempImage/"+fileName)
// 	// if err != nil {
// 	// 	fmt.Println("保存文件失败")
// 	// }
// 	createZip()

// 	// // 读取zip文件
// 	ctx.File("./public/zip/qr.zip")

// }

// func createZip() {
// 	// 将文件夹压缩为zip
// 	zipFile, err := os.Create("./public/zip/qr.zip")
// 	if err != nil {
// 		fmt.Println("创建文件失败")
// 	}
// 	defer zipFile.Close()
// 	zipWriter := zip.NewWriter(zipFile)
// 	defer zipWriter.Close()
// 	// 获取文件夹下的所有文件
// 	fileInfo, err := ioutil.ReadDir("./public/tempImage")
// 	if err != nil {
// 		fmt.Println("读取文件夹失败")
// 	}
// 	for _, v := range fileInfo {
// 		// 打开文件
// 		file, err := os.Open("./public/tempImage/" + v.Name())
// 		if err != nil {
// 			fmt.Println("打开文件失败")
// 		}
// 		defer file.Close()
// 		// 将文件写入zip
// 		fileWriter, err := zipWriter.Create(v.Name())
// 		if err != nil {
// 			fmt.Println("写入zip失败")
// 		}
// 		_, err = io.Copy(fileWriter, file)
// 		if err != nil {
// 			fmt.Println("写入zip失败")
// 		}
// 	}
// }
